home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / serien / purity / nr.30 / forum / pascal-workshop-3 < prev    next >
Text File  |  1995-04-23  |  12KB  |  429 lines

  1.  
  2.  
  3.                       Andreas Mauß & Bernd Künnen
  4.  
  5.  
  6.                             proudly presents
  7.  
  8.  
  9.                    //////////////////////////////////////
  10.                   //                                  //
  11.                  //   PCQ-Pascal Workshop - Teil  3  //
  12.                 //                                  //
  13.                //          ---   DOS   ---         //
  14.               //                                  //
  15.              //////////////////////////////////////
  16.  
  17.  
  18.  
  19.  
  20. Hi, zum dritten Teil des Pascal-Workshops! Bernd und ich haben uns end­
  21. lich aufgerafft, den dritten Teil des heißbegehrten Workshops zu machen.
  22.  
  23. Im heutigen Teil beschäftigen wir uns mit der Include-Datei "Dos".
  24.  
  25. So, nun gleich wieder ran !!!!!!!
  26.  
  27.  
  28. program dos1;
  29.  
  30. {$I "Include:libraries/dos.i" }
  31.  
  32. var
  33.   r,w : Integer;
  34.   hdl : FileHandle;
  35.   buf : Array[0..80] of Char;
  36.  
  37. begin
  38.  
  39.   hdl := DosOutput;
  40.  
  41.   If hdl <> NIL then begin
  42.  
  43.     w := DosWrite( hdl, "Eingabe : ", 10);
  44.  
  45.     r := DosRead( hdl, Adr(buf), 80 );
  46.  
  47.     w := DosWrite( hdl, "Ihre Eingabe war ", 17 );
  48.  
  49.     buf[r+1] := chr(10);
  50.     w := DosWrite( hdl, Adr(buf), r+1 );
  51.  
  52.   end;
  53.  
  54. end.
  55.  
  56. Am Anfang öffnen wir die Include-Datei `Dos.i`. Wir legen 2 Integervaria­
  57. blen, eine FileHandle und eine ARRAY [0..80] of CHAR fest. Auf die Filehand­
  58. levariable(hdl) legen wir den Zeiger von DosOutput fest. Danach fragen wir
  59. `hdl` ab, ob sie größer oder kleiner(ob sie mit einem Zeiger oder einem
  60. Wert) als NIL(0) ist. Wenn dem nicht so ist, springt das Programm zu Begin
  61. wieder zurück. Auf die Variable `w` legen wir die Funktion `DosWrite`. Mit
  62. DosWrite schreibt man einen Text ins Shell/CLI-Fenster. Der Text `Eingabe`
  63. erscheint im Fenster, und wartet auf eine Eingabe (mit Dosread) des Users.
  64. Die 10, in der Procedure bei Dosread, bedeutet das 10 Zeichen reserviert
  65. sind. Diese Zeichen müßen mit der Ein- bzw. Augabe immer übereinstimmen.
  66. Die Zeile `buf[r+1] := chr(10)` bedeutet das buf mit einem Null Byte enden
  67. muß.
  68. Mit w := DosWrite( hdl, Adr(buf), r+1 ); wird dann die Eingabe (ADR(buf))
  69. ausgegeben.
  70.  
  71.  
  72. program dos2;
  73.  
  74. {$I "Include:libraries/dos.i" }
  75.  
  76. var
  77.   w   : Integer;
  78.   hdl : FileHandle;
  79.  
  80. begin
  81.  
  82.   hdl := DosOpen( "s:startup-sequence", Mode_OldFile);
  83.  
  84.   If hdl <> NIL then begin
  85.  
  86.     Writeln("startup-sequence zum Lesen geöffnet.");
  87.  
  88.     DosClose( hdl );
  89.     Writeln("...und wieder geschlossen.");
  90.  
  91.   end else begin
  92.     Writeln("Konnte startup-sequence nicht öffnen!");
  93.   end;
  94.  
  95.  
  96. end.
  97.  
  98. Im zweiten Beispiel öffnen wir mit DosOpen, die im s-Verzeichnis liegende
  99. startup-sequence. Mode OldFile bedeutet das es ein exestierender Text sein
  100. muß, der geöffnet werden soll. Ist die Variable `hdl` mit einem Wert belegt,
  101. wird der Text "startup-sequence zum Lesen geöffnet" ausgegeben. Mit `Dosclo­
  102. se (hdl)` schließen wir wieder die startup-sequence, und geben den Text `...
  103. und wieder geschlossen.`. IST hdl = NIL verzweigt die IF-Then-Else Anweisung
  104. zu `end else begin` und gibt mit WriteLn den Text `Konnte startup-sequence
  105. nicht öffnen!` aus.
  106.  
  107.  
  108. program dos3;
  109.  
  110. {$I "Include:libraries/dos.i" }
  111.  
  112. var
  113.   w   : Integer;
  114.   hdl : FileHandle;
  115.  
  116. begin
  117.  
  118.   hdl := DosOpen( "CON:0/10/600/190/InfoX", Mode_NewFile);
  119.  
  120.   If hdl <> NIL then begin
  121.  
  122.     w := DosWrite( hdl, "\n  CON-Fenster als *Datei*\n\n (4 sec.)\n", 38);
  123.  
  124.     Delay(200);      { * 4 sec. warten * }
  125.  
  126.     DosClose( hdl );
  127.  
  128.   end;
  129.  
  130. end.
  131.  
  132. Mit DosOpen wird ein neues CLI-Fenster geöffnet. Diesmal steht am Ende `Mode
  133. NewFile` das eine neue Datei erstellt/öffnet. Mit DosWrite öffnen wir ein
  134. CLI-Fenster mit den Angaben aus der hdl-Variable(DosOpen). Mit Delay warten
  135. wir 4 Sekunden, bis dann DosClose das Fenster wieder schließt.
  136.  
  137.  
  138. program dos4;
  139.  
  140. {$I "Include:libraries/dos.i" }
  141.  
  142. var
  143.   hdl   : FileHandle;
  144.  
  145. begin
  146.         hdl := DosInput;
  147.  
  148.         If IsInteractive( hdl ) then
  149.           writeln("Standardeingabe ist interaktiv, also ein Fenster.")
  150.         else
  151.           begin
  152.             writeln("Std.eingabe ist nicht interaktiv, also wahrsch.");
  153.             writeln("eine Datei per Redirektion: dos9 >ram:datei ");
  154.           end;
  155.  
  156.  
  157. end.
  158.  
  159. Die Filehandle-Variable zeigt in diesem Beispiel auf DosInput. Mit der Pro­
  160. cedure IsInteractive überprüfen wie ob `hdl` interaktiv ist, also ob es ein
  161. Fenster oder eine Datei ist!
  162. Die If-Then-Else Anweisung weißt dann auf die entsprechende Zeile und gibt
  163. dann den Text aus.
  164.  
  165.  
  166. program dos5;
  167.  
  168. {$I "Include:libraries/dos.i" }
  169.  
  170. Const
  171.         name : String = "startup-sequence";
  172.  
  173. var
  174.   w       : Integer;
  175.   oldlock,
  176.   newlock : FileLock;
  177.   hdl     : FileHandle;
  178.  
  179. begin
  180.  
  181.   hdl := DosOpen( name, Mode_OldFile );
  182.   If hdl = NIL then
  183.     writeln("Im aktuellen Directory keine Datei namens ", name)
  184.   else
  185.     begin
  186.       writeln("Uuups, sind wir tatsächlich schon in s: ?");
  187.       DosClose(hdl);
  188.     end;
  189.  
  190.   newlock := Lock( "s:", Shared_Lock );
  191.   IF newlock = NIL then
  192.  
  193.     writeln("Kann s: nicht finden.")
  194.  
  195.   Else
  196.  
  197.     Begin
  198.       oldlock := CurrentDir( newlock );
  199.       writeln("Bin jetzt im directory s: ...");
  200.  
  201.  
  202.       hdl := DosOpen( name, Mode_OldFile );
  203.       If  hdl = NIL
  204.       then
  205.         writeln("Auch in s: keine ", name, " ? Seltsam.")
  206.       else
  207.         begin
  208.           writeln("Da ist ja die ", name );
  209.           DosClose(hdl);
  210.         end;
  211.  
  212.  
  213.       newlock := CurrentDir( oldlock );
  214.       If newlock <> NIL then UnLock(newlock);
  215.     End;
  216.  
  217. end.
  218.  
  219. Wir belegen mit der Konstante `name` den String "startup-sequence". Danach
  220. versuchen wir mit DosOpen die startup-sequence zu öffnen, und fragen danach
  221. wieder ab, ob die Variable `hdl` einen Wert hat. Findet das Programm die
  222. `startup-sequence` nicht, wird der Text "Im aktuellen Directory keine Datei
  223. namens startup-sequence` im Fenster aus. Findet das Programm allerdings die
  224. startup-sequence wird der Text nach else begin ausgegeben, und die startup-
  225. sequence wird wieder geschlossen.
  226. Mit newlock := Lock( "s:", Shared_Lock ); suchen wir das s-Verzeichnis. Fin­
  227. det das Programm das s-Verzeichnis nicht, wird der Text `kann s nicht finden
  228. ausgegeben. Hat newlock einen Wert, wechseln wir mit CurrentDir(NewLock) ins
  229. s-Verzeichnis, und geben den Text `Bin jetzt im directory s: ...` aus.
  230. Danach versucht das Programm wieder die Startup-Sequence zu öffnen, und gibt
  231. den jeweiligen Text aus, ob die Datei geöffnet worden ist, oder nicht. Dan­
  232. ach schließt das Programm wieder die startup-sequence(sofern sie geöffnet
  233. worden ist) und wechselt wieder ins alte Verzeichnis. Danach löschen wir
  234. noch den Wert der newlock-Variable
  235.  
  236.  
  237. program dos6;
  238.  
  239. {$I "Include:libraries/dos.i" }
  240.  
  241. Const
  242.   offset = 102;
  243.   dateiname = "devs:system-configuration";
  244.  
  245. var
  246.   pos,
  247.   w,z   : Integer;
  248.   hdl   : FileHandle;
  249.  
  250. begin
  251.  
  252.   hdl := DosOpen( dateiname, Mode_OldFile);
  253.  
  254.   If hdl <> NIL then begin
  255.  
  256.     Writeln(" Datei zum Lesen geöffnet.");
  257.  
  258.     pos := Seek( hdl, offset, Offset_Beginning );
  259.  
  260.     WriteLn(" Datei     :   ", dateiname );
  261.     WriteLn(" offset    :   ", offset );
  262.     WriteLn(" alte Pos. :   ", pos );
  263.  
  264.     pos := Seek( hdl, 0, Offset_Current );
  265.     WriteLn(" akt. Pos. :   ", pos );
  266.  
  267.     Write  (" Integer bei Offset", pos, " : ");
  268.  
  269.  
  270.     w := DosRead( hdl, Adr( z ), 4 );
  271.     If w<>4 then
  272.       WriteLn("\nKonnte die 4 Bytes nicht lesen.")
  273.     Else
  274.       WriteLn( z );
  275.  
  276.     DosClose( hdl );
  277.     Writeln("\n\n...und wieder geschlossen.");
  278.  
  279.   end else begin
  280.     Writeln("Konnte system-configuration nicht öffnen!");
  281.   end;
  282.  
  283.  
  284. end.
  285.  
  286. Die offset Konstante belegen wir mit dem Wert 102 und dateiname mit
  287. `devs:system-configuration`. Wir versuchen die Variable `dateiname` zu
  288. öffnen, und fragen danach wieder ab, ob es geglückt ist. Mit Seek positio­
  289. nieren wir einen 'Dateizeiger', der die aktuelle Position in der datei
  290. verwaltet. Mit WriteLn geben wir die Daten/Werte(dateiname,offset,pos) aus.
  291. Jetzt gibt das Programm mit WriteLn die aktuelle Position aus. Mit Dosread
  292. wird der Wert dann eingelesen und es wird abgefragt, ob der Wert größer oder
  293. kleiner als 4 ist und gibt den Text `konnte die 4 Bytes nicht lesen` aus.
  294. Ist der Wert(z) gleich 4, wird der Wert(z) ausgegeben, und die Datei system-
  295. configuration wird geschloßen. Wurde die Datei system-configuration erst
  296. garnicht gefunden, verweißt das Programm auf end else begin, und der Text
  297. `Konnte system-configuration nicht öffnen` wird ausgegeben.
  298.  
  299. program dos7;
  300.  
  301. {$I "Include:libraries/dos.i" }
  302.  
  303. var
  304.   w,z   : Integer;
  305.   buf   : Array[0..99] of Char;
  306.   name  : String;
  307. begin
  308.         name := Adr(buf);
  309.  
  310.         Write("Welche Datei soll gelöscht werden ? ");
  311.         Readln( name );
  312.  
  313.         z:=-1;
  314.         repeat
  315.           Inc(z);
  316.           if name[z]   = chr(10)        { Muß mit Nullbyte enden }
  317.           then name[z] := chr(0);       { Also Return zu Null }
  318.         until name[z] = chr(0);
  319.  
  320.         If DeleteFile( name ) Then
  321.           writeln("Datei '", name, "' gelöscht.")
  322.         else
  323.           writeln("Konnte Datei '", name, "' nicht löschen.");
  324.  
  325. end.
  326.  
  327. Mit unserem nächsten Programm können wir Dateien löschen, also VORSICHT mit
  328. diesem Programm.
  329. Mit der String Variablen `name` können wir 100 Zeichen aufnehmen. Mit
  330. ReadLn(name) lesen wir die Datei ein, die gelöscht werden soll. Mit der
  331. Repeat-Anweisung muß die `name` Variable mit einem Null-Byte enden. Danach
  332. löschen wir mit DeletFile(name) die Datei, und geben den Text aus. Wurde die
  333. Datei nicht gefunden, oder irgendetwas ging schief, passiert nichts, und der
  334. Text `Konnte Datei "name"nicht löschen.` ausgegeben.
  335.  
  336.  
  337.  
  338. program dos8;
  339.  
  340. {$I "Include:libraries/dos.i" }
  341. {$I "Include:utils/stringlib.i" }
  342. {$I "Include:utils/parameters.i" }
  343.  
  344. var
  345.   ret   : Integer;
  346.   buf   : Array[0..99] of Char;
  347.   parm  : String;
  348.  
  349. begin
  350.         parm := Adr(buf);
  351.         GetParam( 1, parm );
  352.  
  353.         If strlen( parm )=0 then begin
  354.           writeln("dos8, gibt einen returncode zurück.");
  355.           writeln(" Aufruf : dos7 [5|10|15|15]");
  356.           DosExit(0);
  357.         End;
  358.  
  359.         ret := 0;
  360.         If strcmp( parm,  "5")=0 then ret :=  5;
  361.         If strcmp( parm, "10")=0 then ret := 10;
  362.         If strcmp( parm, "15")=0 then ret := 15;
  363.         If strcmp( parm, "20")=0 then ret := 20;
  364.  
  365.         Writeln("dos8 gibt ", ret, " ans CLI zurück.");
  366.         DosExit( ret );
  367.  
  368. end.
  369.  
  370.  
  371. Die Stringvariable `parm` hat wieder einen Puffer von 100 Zeichen. Mit Get­
  372. Param können wir einen Parameter/Wert aufnehmen. In der If-End Anweisung
  373. wird erforscht, ob `parm` einen Wert besitzt. Wenn `parm` keinen Parameter
  374. besitzt, werden die beiden WriteLn-Zeilen ausgegeben. Besitzt `parm` einen
  375. Wert, wird dieser, an eine Integervariable übergeben und ein Text mit
  376. dem Ergebnis ausgegeben. Der Aufruf des Programms muß einen Parameter haben!
  377. Z.B. "Dos8 10".
  378.  
  379.  
  380. program dos9;
  381.  
  382. {$I "Include:libraries/dos.i" }
  383. {$I "Include:utils/stringlib.i" }
  384. {$I "Include:utils/parameters.i" }
  385.  
  386. var
  387.   buf1,
  388.   buf2   : Array[0..99] of Char;
  389.   parm1,
  390.   parm2  : String;
  391.  
  392. begin
  393.         parm1 := Adr(buf1);
  394.         parm2 := Adr(buf2);
  395.         GetParam( 1, parm1 );
  396.         GetParam( 2, parm2 );
  397.  
  398.         If  ( buf1[0] = chr(0) )
  399.         Or  ( buf2[0] = chr(0) )
  400.         then
  401.           begin
  402.             writeln("Aufruf: dos10 dateiname Kommantar");
  403.             DosExit(0);
  404.           end;
  405.  
  406.         If SetComment( parm1, parm2)
  407.         then
  408.           writeln("Kommentar erfolgreich gesetzt.")
  409.         else
  410.           writeln("Konnte Kommentar zur Datei '",
  411.                   parm1,
  412.                   "' nicht setzen!");
  413.  
  414. end.
  415.  
  416. Zwei Stringvariablen mit einem Puffer (mal wieder) von 100 Zeichen werden
  417. deklariert. Es wird abgefragt ob `parm1&2` Werte haben. Haben die Va­
  418. riablen einen WERT, wird ein Kommentar gesetzt, der am Anfang des Aufrufes
  419. eingegeben werden muß. Z.B. `Dos9 dir Directoryausgabe`. Danach wird noch
  420. überprüft, ob der Kommentar erfolgreich übersetzt wurde.
  421.  
  422.  
  423. So, das war schon wieder der Pascal-Worshop mit `DOS`! In näherer Zukunft
  424. werden Bernd und ich, einen weiteren Pascal-Workshop machen, der sich mit
  425. Intution beschäftigt!
  426.  
  427.  
  428. Bis dann......
  429.